package com.adee.java;

/*
* synchronized锁升级过程（不可逆）：偏向锁、轻量级锁、重量级锁
* 1. 偏向锁
*    在锁对象的对象头中记录一下当前获取到该锁的线程的ID，该线程下次如果有来获取该锁就可以直接获取到了。
* 2. 轻量级锁
*    由偏向锁升级而来，当一个线程获取到锁后，此时这把锁是偏向锁，此时如果有第二个线程来竞争锁，偏向锁就会升级为轻量级锁，是为了和
*    重量级锁区分开来，轻量级锁底层是通过自旋来实现的，并不会阻塞线程（切换线程状态）。
* 3. 如果自旋次数过多仍没有获取到锁，则会升级为重量级锁，重量级锁导致线程阻塞。
* 4. 自旋锁：自旋锁就是线程在获取锁的过程中，不会去阻塞线程，也就无所谓唤醒线程，阻塞和唤醒这两个步骤是通过操作系统去进行的，比较
*    消耗时间，自旋锁是线程通过CAS获取预期的一个标记，如果没有获取到，则继续循环获取，如果获取到了则表示获取到了这个锁，这个过程
*    线程一直在运行中，相对来说没有使用太多操作系统资源，比较轻量。
*
* synchronized和ReentrantLock的区别
* 1. synchronized是一个关键字，ReentrantLock是一个类；
* 2. synchronized会自动加锁与释放锁，ReentrantLock需要手动加锁和释放锁；
* 3. synchronized底层是jvm层面的锁，ReentrantLock是API层面的锁；
* 4. synchronized是非公平锁（没有线程排队），ReentrantLock可以选择公平或非公平；
* 5. synchronized锁的是对象，锁信息保存在对象头中，ReentrantLock通过代码中int类型的state标识来标识锁的状态；
* 6. synchronized底层有一个锁升级的过程。
*
* */
public class Test027_synchronized {
    public static void main(String[] args) {

    }
}
